package main

import (
	"log"

	"github.com/boltdb/bolt"
)

// BlockchainIterator 区块链迭代器
type BlockchainIterator struct {
	currentHash []byte   // 当前区块的哈希
	db          *bolt.DB // 数据库连接
}

// Iterator 创建并返回一个区块链迭代器
func (bc *Blockchain) Iterator() *BlockchainIterator {
	bci := &BlockchainIterator{bc.tip, bc.db}

	return bci
}

// Next 返回链中的下一个区块
func (i *BlockchainIterator) Next() *Block {
	var block *Block

	// 从数据库中读取区块
	err := i.db.View(func(tx *bolt.Tx) error {
		b := tx.Bucket([]byte(blocksBucket))
		// 使用当前哈希获取序列化的区块数据
		encodedBlock := b.Get(i.currentHash)
		// 反序列化区块
		block = DeserializeBlock(encodedBlock)

		return nil
	})
	if err != nil {
		log.Panic(err)
	}

	// 更新当前哈希为前一个区块的哈希
	i.currentHash = block.PrevHash

	return block
}
